package com.atguigu.juc;

public class TicketTarget implements Runnable {
    private int ticket = 50;//50张票

    @Override
    public void run() {
        while (ticket > 0) {
            try {
                // 模拟一个耗时的操作(买票前的询问)
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (this) {
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "-->卖出了第  " + ticket + "  张票");
                    ticket--;
                }
            }
        }
        /*为了避免虚假唤醒带来的问题，通常推荐使用循环检查来确保线程只有在满足特定条件时才继续执行。这意味着应该用while循环而不是if语句来包裹wait()调用。这是因为：
if语句只会检查一次条件是否满足。如果线程因虚假唤醒而被激活，它会继续执行，即使条件并不满足。
while循环会在每次从wait()返回时都重新检查条件。这样可以保证即便发生了虚假唤醒，只要条件不满足，线程就会再次进入等待状态。
为什么会出现虚假唤醒？
系统调度：操作系统可能会因为内部原因或其他外部因素而随机地唤醒一个正在等待的线程。
JVM实现细节：Java虚拟机的某些实现可能出于性能优化或者其他考虑，也会导致线程的非预期唤醒。
硬件中断：硬件层面的中断也有可能引起线程的非预期唤醒。
*/

    }
}
